package it.pir.es05ChatTCP_TLS;

import java.io.*;
import java.net.*;

import javax.net.SocketFactory;
import javax.net.ssl.SSLSocketFactory;

public class ClientObj extends Client {
	
	private ObjectOutputStream objectOutputStream;

	public ClientObj(String nickname, String address, int port) throws UnknownHostException, IOException {
		super(nickname, address, port);
	}
	
	public static Socket createSocket(String host, int port) throws IOException {
	       
		//creazione di una scoket factory
		SocketFactory factory=SSLSocketFactory.getDefault();
		
		//una volta creata una factory creo la socket passando l'IP e la port del destinatario
	    Socket sock = factory.createSocket(address, port);
	    
	    return sock;
	}
	
	@Override
	protected void connect() throws IOException {
		
		//TODO modificare il path
		//collego il client al proprio keystore e al truststore
		// i file che si creano vanno nella cartella bin del progetto, cioè dove sono gli eseguibili
		System.setProperty("javax.net.ssl.keyStore", "keystore.jks");
		System.setProperty("javax.net.ssl.keyStorePassword", "pirchattls");
		System.setProperty("javax.net.ssl.trustStore","truststore.jks");
		System.setProperty("javax.net.ssl.trustStorePassword","pirchattls");
	    
		//richiamo il metodo createSocket 
		socket = createSocket(address, port);
		
		
		
		objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
		Message authentication = new Message(nickname, "", Message.AUTHENTICATION);
		sendMessage(authentication);
	}

	@Override
	public void sendMessage(Message message) throws IOException {
		objectOutputStream.writeObject(message);
		objectOutputStream.flush();
	}

	@Override
	public void run() {
		ObjectInputStream objectInputStream;
		try {
			objectInputStream = new ObjectInputStream(socket.getInputStream());
			while(true) {
				reply=(Message)objectInputStream.readObject();
				System.out.println(reply.getNickname() + ": "+ reply.getMessage());
			}
		} catch (IOException e) {
			System.out.println("ERRORE! Problemi di comunicazione con il server!");
			//e.printStackTrace();
			// Il programma termina perché il nome utente è già in uso
			System.exit(1);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		
	}

}
